# python操作redis的代码演示
# python中常用于操作redis的包一般有2个: redis和pyredis
# 其他中最常见的是redis
# 通过 pip install redis，安装完成以后，redis包又提供了2个类给我们使用：Redis,StrictRedis
"""导包"""
from redis import Redis
"""链接redis数据库"""
redis = Redis(host="127.0.0.1",port=6379,db=0)
"""
针对redis在python中的操作，大部分和终端下没有区别。
就是把原来的命令名称作为了方法名，命令后面跟着的参数就是方法的参数了
例如：
终端： set username xiaoming
python: redis.set("username","xiaoming")

终端： setex username 60 xiaoming
python: redis.setex("username",60,"xiaoming")

注意： 因为在python中del是关键字，所以redis中del删除键命令，在python使用delete代替

"""
# 添加一个字符串数据 set name xiaoming
# redis.set("name","xiaoming")

# 添加一个临时数据, setex title 30 hello
# redis.setex("title",30,"hello")

# 查看一个数据的有效期,-2表示过期,-1表示永久
# time = redis.ttl("title")
# print(time)

# 获取一个字符串
# name = redis.get("name")
# print(name)  # 得到的结果是bytes类型的   b'xiaoming'
# print(name.decode()) # 必须要解码,xiaoming

# 删除key,因为del是一个关键词,所以在redis模块,凡是命令如果是一个关键词,全部改成单词的全拼
# ret = redis.delete("name")
# 看返回值，如果值为1，则表示删除成功，如果值为0，则表示没有删除东西，必然是键不存在了。
# print(ret)


# 哈希的操作
# hset 键 域 值
# redis.hset("brother","liubei",28)
# 设置多个键值对
# dict1 = {
#     "guanyu": 22,
#     "zhangfei": 18,
#     "xiaoming": 12
# }
# redis.hmset("brother",dict1)

# 获取hash数据并展示出来
# brothers = redis.hgetall("brother")
# print(brothers) # {b'liubei': b'28', b'guanyu': b'22', b'zhangfei': b'18', b'xiaoming': b'12'}

# 展示所有数据
# for key_bytes,val_bytes in brothers.items():
#     key = key_bytes.decode()
#     val=val_bytes.decode()
#     print(key,val)

# 获取指定域的值
# print( brothers["zhangfei".encode()].decode() )

# print( type( brothers["zhangfei".encode()].decode()) ) # <class 'str'>

# 为了保证不会引起不同数据类型之间的冲突，先删除box
redis.delete("box")
redis.rpush("box","苹果","xiangjiao","xigua")
list1 = redis.lrange("box",0,-1)
# print(list1) # [b'\xe8\x8b\xb9\xe6\x9e\x9c', b'xiangjiao', b'xigua']
# print(list1[0]) # b'\xe8\x8b\xb9\xe6\x9e\x9c'
# print(list1[0].decode()) # 苹果
                                     
for item in list1:
    print(item.decode())